package com.kabongos.daos;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import com.kabongos.sources.Estadio;
import com.kabongos.sources.Util;

public class DaoEstadio extends DaoGenerico<Estadio> {

    @Override
    public void atualiza(Estadio estadio) {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        }

        Connection con = null;
        PreparedStatement prst = null;
        String sql = "update estadios set nome = ?, data_fundacao = ?, capacidade = ? where matricula = ?";
        try {
            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);

            prst = con.prepareStatement(sql);
            prst.setString(1, estadio.getNome());
            if (estadio.getDataFundacao() == null) {
                prst.setNull(2, Types.DATE);
            } else {
                prst.setDate(2, new Date(estadio.getDataFundacao().getTime()));
            }
            prst.setLong(3, estadio.getCapacidade());
            prst.setLong(4, estadio.getMatricula());
            prst.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(prst);
            Util.closeConnection(con);
        }

    }

    @Override
    public void cadastra(Estadio estadio) {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        }

        Connection con = null;
        PreparedStatement prst = null;
        Statement st = null;
        String sql = "insert into estadios (nome, data_fundacao, capacidade) values (?, ?, ?)";
        try {
            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);

            prst = con.prepareStatement(sql);
            prst.setString(1, estadio.getNome());
            prst.setDate(2, new Date(estadio.getDataFundacao().getTime()));
            prst.setLong(3, estadio.getCapacidade());

            prst.executeUpdate();

            st = con.createStatement();
            sql = "SELECT MAX(matricula) FROM estadios  ";
            ResultSet rs = st.executeQuery(sql);

            while (rs.next()) {
                estadio.setMatricula(rs.getLong(1));
            }

        } catch (SQLException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(prst);
            Util.closeStatement(st);
            Util.closeConnection(con);
        }

    }

    @Override
    public void exclui(Estadio estadio) {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        }

        Connection con = null;
        PreparedStatement prst = null;
        String sql = "delete from estadios where matricula = ?";
        try {
            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);

            prst = con.prepareStatement(sql);
            prst.setLong(1, estadio.getMatricula());

            prst.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(prst);
            Util.closeConnection(con);
        }

    }

    @Override
    public List<Estadio> recupera() {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        }

        Connection con = null;
        Statement st = null;
        List<Estadio> estadios = new ArrayList<Estadio>();
        String sql = "SELECT nome, data_fundacao, capacidade, matricula from estadios";
        try {

            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);

            st = con.createStatement();

            ResultSet rs = st.executeQuery(sql);

            while (rs.next()) {
                Estadio estadio = new Estadio(rs.getString(1), rs.getDate(2));
                estadio.setCapacidade(rs.getLong(3));
                estadio.setMatricula(rs.getLong(4));

                estadios.add(estadio);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(st);
            Util.closeConnection(con);
        }

        return estadios;
    }

    @Override
    public Estadio recupera(long matricula) {

        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        }

        Connection con = null;
        PreparedStatement prst = null;
        Estadio estadio = null;
        String sql = "SELECT nome, data_fundacao, capacidade FROM estadios WHERE matricula = ?";
        try {

            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);

            prst = con.prepareStatement(sql);
            prst.setLong(1, matricula);
            ResultSet rs = prst.executeQuery();

            if (rs.next()) {
                estadio = new Estadio(rs.getString(1), rs.getDate(2));
                estadio.setCapacidade(rs.getLong(3));

            }
        } catch (SQLException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(prst);
            Util.closeConnection(con);
        }

        return estadio;
    }

    public static void atualizaEstadioDoClube(Estadio estadio, long matriculaClube) {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        }

        Connection con = null;
        PreparedStatement prst = null;
        String sql = "update estadios set matricula_clubes = ? where matricula = ?";
        try {
            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);
            prst = con.prepareStatement(sql);
            prst.setLong(1, matriculaClube);
            prst.setLong(2, estadio.getMatricula());
            prst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(prst);
            Util.closeConnection(con);
        }

    }

    public static Estadio recuperaEstadioDoTime(long clube) {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        }
        Estadio estadio = null;
        Connection con = null;
        PreparedStatement prst = null;
        List<Estadio> estadios = new ArrayList<Estadio>();
        String sql = "SELECT nome, data_fundacao, capacidade, matricula from estadios where matricula_clubes = ?";
        try {

            DriverManager.setLoginTimeout(5);
            con = DriverManager.getConnection(URL);

            prst = con.prepareStatement(sql);
            prst.setLong(1, clube);

            ResultSet rs = prst.executeQuery();

            if (rs.next()) {
                estadio = new Estadio(rs.getString(1), rs.getDate(2));
                estadio.setCapacidade(rs.getLong(3));
                estadio.setMatricula(rs.getLong(4));
                // clube.setEstadio(Estadio.recuperaEstadio(rs.getString(3)));
                // String descricao= rs.getString("descricao").toString();

                estadios.add(estadio);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            // retval = retval.append(e.toString());

            throw new RuntimeException(e);
        } finally {
            Util.closeStatement(prst);
            Util.closeConnection(con);
        }

        return estadio;
    }

}
